#include "user.h"
/*
    功能：创建用户信息
    返回值：成功：用户信息空间地址，失败: NULL
*/
PUserType CreateUserInfo()
{
    PUserType p = (PUserType)malloc(sizeof(UserType));//注意内存泄漏！

	//检查开辟空间是否成功
	if (p == NULL) {
		printf("开辟空间失败!\n");
		return NULL;
	}

    return p;
}

/*
    参数：pUser 用户信息空间地址
    功能：释放用户信息
*/
void UserFree(PUserType *pUser)
{
    if(pUser != NULL && *pUser != NULL)
    {
        free(*pUser);
        *pUser = NULL;
    }
}


/*                    Server                      */
/*
    参数：pUserTable 用户信息表空间地址
    功能：将用户信息表保存到文件中
*/
void SaveUserTable(PSeqListType pUserTable)
{
    if(pUserTable == NULL)
    {
        return ;
    }
    char path[50] = "./UserTable";
    int fd = -1;
    int res = -1;

    //从文件中以二进制方式读出保存到用户信息表
    fd = open(path, O_WRONLY|O_CREAT|O_TRUNC,0666);
	if(-1 == fd)
	{
		return ;
	}
	
    for(int i = 0; i <= pUserTable->last; i++)
    {
        res = write(fd, &pUserTable->data[i],sizeof(pUserTable->data[i]));
        if(res == -1)
        {
            return ;
        }
    }
	close(fd);
}

/*
    功能：从文件中载入用户信息表
    返回值：成功：用户信息表空间地址，失败: NULL
*/
PSeqListType LoadUserTable()
{
    char path[50] = "./UserTable";
    ElementType user = {};
    int fd = -1;
    int res = -1;

    PSeqListType pUserTable = CreateEpSeqlist();//注意内存泄漏！
	//检查开辟空间是否成功
	if (pUserTable == NULL) {
		return NULL;
	}

    //从文件中以二进制方式读出保存到用户信息表
    fd = open(path,  O_RDONLY|O_CREAT,0666);
	if(-1 == fd)
	{
        MyFree(&pUserTable);
		return NULL;
	}
	
    while(1)
    {
        res = read(fd, &user, sizeof(user));//res 0, -1, 个数
        if(res == -1)
        {
            MyFree(&pUserTable);
            return NULL;
        }
        else if(res == 0)
        {
            break;//读完了
        }
        else
        {
            //保存到用户信息表
            InsertIntoSeqlist(pUserTable, pUserTable->last + 1, user);
        }
    }
	close(fd);
    return pUserTable;
}

/*
    参数：
        userId     用户ID
        pUserTable 用户表信息空间地址
    功能：判断用户是否存在
    返回值：
        存在 用户下标
        不存在 -1
*/
int IsExistUserByUserId(long userId, PSeqListType pUserTable)
{
    for(int i = 0; i <= pUserTable->last; i++)
    {
        if(pUserTable->data[i].userInfo.userId == userId)
        {
            return i;
        }
    }
    return -1;
}

/*
    参数：
        pUser 用户信息空间地址
    功能：访问登录
    返回值：
        0  登录成功
        -1 程序异常
        1  用户不存在
        2  重复登录
        3  密码不正确
*/
int Login(long userId, const char* password, PSeqListType pUserTable)
{
    int result = -1;
    for(int i = 0; i <= pUserTable->last; i++)
    {
        if(pUserTable->data[i].userInfo.userId == userId)
        {
            if(0 == strcmp(pUserTable->data[i].userInfo.password, password))
            {
                if(pUserTable->data[i].userInfo.state == 0)
                {
                    pUserTable->data[i].userInfo.state = 1;
                    ResponseLogin(userId, 0, &pUserTable->data[i].userInfo);
                    return 0;
                }
                else
                {
                    ResponseLogin(userId, 2, NULL);
                    return 2;
                }
            }
            else
            {
                ResponseLogin(userId, 3, NULL);
                return 3;
            }
        }
    }
    ResponseLogin(userId, 1, NULL);
    return 1;
}

/*
    参数：
        result： 
            0  注册成功
            -1 程序异常
            1  用户存在 
    功能：响应注册 
*/
int Register(PElementType pUser, PSeqListType pUserTable)
{
    //如果是判断返回值用bool类型
    int res = IsExistUserByUserId(pUser->userInfo.userId, pUserTable);
    if(res != -1)//用户存在
    {
        ResponseRegister(pUser->userInfo.userId, 1);
        return 1;
    }

    int result = InsertIntoSeqlist(pUserTable, pUserTable->last+1, *pUser);
    if(result == 1)
    {
        ResponseRegister(pUser->userInfo.userId, 0);
        return 0;
    }
    else
    {
        ResponseRegister(pUser->userInfo.userId, -1);
        return -1;
    }
}

/*
    参数：
        userId      用户ID
        pUserTable 用户表信息空间地址 
    功能：响应登出
    -1 失败
    1  成功
*/
void Logout(long userId, PSeqListType pUserTable)
{
    int result = -1;
    int post = IsExistUserByUserId(userId, pUserTable);
    if(post != -1)
    {
        pUserTable->data[post].userInfo.state = 0;
        result = 0;
    }
    ResponseLogout(userId, result);
}

/*
    参数：
        userId      用户ID
        pUserTable 用户表信息空间地址 
    功能：响应注销
    返回值：
        1 成功
        -1 //程序异常
        0 失败
*/
int Destroy(long userId, PSeqListType pUserTable)
{
    int post = IsExistUserByUserId(userId, pUserTable);
    if(post != -1)
    {
        int res = DeletePostSeqlist(pUserTable, post);
        if(res == 1)
        {
            ResponseDestroy(userId, 1);
            return res;//删除成功
        }
        else
        {
            ResponseDestroy(userId, -1);
            return -1;//程序异常
        }
    }
    ResponseDestroy(userId, -1);
    return 0;
}
